/**
 * 导出指定元素为 PDF 文件
 * @param {HTMLElement} element - 要导出的 DOM 元素
 * @param {string} filename - 保存的文件名，默认为 "未命名"
 * @param {function} callback - 导出完成后的回调函数
 */
export async function exportPdfFile(element: HTMLElement, filename = "未命名", callback = () => { }) {
  console.log("element>", element);
  if (!element) {
    callback(); // 如果没有元素，直接执行回调并返回
    return;
  }

  // 获取导出元素的宽度，默认 700px
  const originWidth = element.offsetWidth || 700;

  // 创建一个容器，克隆原始内容以便生成 PDF
  const container = document.createElement("div");
  container.style.cssText = `position:fixed;left: ${-2 * originWidth}px; top:0;padding:16px;width:${originWidth}px;box-sizing:content-box;`;
  document.body.appendChild(container);
  container.appendChild(element.cloneNode(true));

  // 动态加载所需的库
  const html2canvas = await import("html2canvas").then((module) => module.default);
  const { jsPDF } = await import("jspdf");

  // PDF 输出的相关尺寸配置
  const scale = 2; // 缩放倍数，提高清晰度
  const width = originWidth + 32; // 加上 padding
  const PDF_WIDTH = width * scale; // PDF 页面宽度
  const PDF_HEIGHT = PDF_WIDTH * 1.414; // 按 A4 纸比例计算页面高度
  const PAGE_MARGIN_TOP = 0; // 每页顶部边距
  const PAGE_MARGIN_BOTTOM = 16; // 每页底部边距
  /**
   * 渲染并生成 PDF
   */
  const render = () => {
    html2canvas(container, { scale: scale, }).then((canvas) => {
      const contentWidth = canvas.width;
      const contentHeight = canvas.height;

      const pageHeight = (contentWidth / PDF_WIDTH) * PDF_HEIGHT; // 单页高度
      const imgWidth = PDF_WIDTH; // 图片宽度
      const imgHeight = (PDF_WIDTH / contentWidth) * contentHeight; // 图片高度

      let leftHeight = contentHeight; // 剩余内容高度
      let position = 0; // 当前绘制内容的位置

      // 创建 PDF 实例
      const doc = new jsPDF("p", "px", [PDF_WIDTH, PDF_HEIGHT]);

      // 判断是否超出单页高度
      if (leftHeight < pageHeight - PAGE_MARGIN_TOP) {
        // 单页内容
        doc.addImage(canvas, "PNG", 0, 0, imgWidth, imgHeight);
      } else {
        // 多页内容
        while (leftHeight > 0) {
          doc.addImage(canvas, "PNG", 0, position, imgWidth, imgHeight);
          leftHeight -= pageHeight; // 减去当前页高度
          position -= PDF_HEIGHT - PAGE_MARGIN_TOP; // 更新下一页的起始位置

          if (leftHeight > 0) {
            doc.addPage(); // 添加新页
          }
        }
      }

      // 保存 PDF 文件
      doc.save(filename + ".pdf");

      // 清理临时容器
      container.remove();
      callback(); // 调用回调函数
    });
  };

  // 处理图片，替换为 base64 格式（避免跨域问题）
  const eleImgs = container.querySelectorAll("img");
  const length = eleImgs.length;

  if (length === 0) {
    render(); // 如果没有图片，直接生成 PDF
    return;
  }

  let processed = 0; // 已处理的图片计数
  eleImgs.forEach((ele) => {
    const src = ele.src;

    if (!src) {
      processed++;
      if (processed === length) render(); // 如果所有图片处理完毕，开始渲染
      return;
    }

    // 图片加载完成后检查跨域
    ele.onload = () => {
      if (!/^http/.test(ele.src)) {
        processed++;
        if (processed === length) render(); // 如果所有图片处理完毕，开始渲染
      }
    };

    // 请求图片资源，并转为 base64
    fetch(src)
      .then((res) => res.blob())
      .then((blob) => {
        const reader = new FileReader();
        reader.onload = function () {
          ele.src = this.result as string; // 替换图片的 src 为 base64
        };
        reader.readAsDataURL(blob);
      })
      .catch(() => {
        processed++;
        if (processed === length) render(); // 如果所有图片处理完毕，开始渲染
      });
  });
}
